package com.imageim.yimirror.common.util;

import android.util.Log;

import com.imageim.yimirror.BuildConfig;

/**
 * 自定义log日志工具类
 */
public class LogUtil {

    /****************** 日志级别 ******************/
    public static final int VERBOSE = 2;

    public static final int DEBUG = 3;

    public static final int INFO = 4;

    public static final int WARN = 5;

    public static final int ERROR = 6;

    public static final int ASSERT = 7;
    /****************** 日志级别 ******************/

    /**
     * 是否是发布版本
     */
    public static final boolean ISRELEASE = "release".equals(BuildConfig.BUILD_TYPE);

//    public static final boolean ISRELEASE = true;
    /**
     * 当前log打印最高级别
     */
    public static final int CURRENT_LEVEL = ASSERT;

    public static void i(String tag, String msg) {
        if (ISRELEASE) {
            return;
        }
        if (INFO <= CURRENT_LEVEL) {
            Log.i(tag, msg);
        }
    }


    //    public static void d(String tag, String msg) {
    //        if (ISRELEASE) {
    //            return;
    //        }
    //
    //        //信息太长,分段打印
    //        int maxStrLength = 2001 - tag.length();
    //        //大于4000时
    //        while (msg.length() > maxStrLength) {
    //            Log.d(tag, msg.substring(0, maxStrLength));
    //            msg = msg.substring(maxStrLength);
    //        }
    //        //剩余部分
    //        Log.d(tag, msg);
    //    }


    private static boolean sTagIsSpace = false; // log标签是否为空白
    private static boolean isLogBorder = false; // log边框开关
    private static final String TOP_BORDER = "┱┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄";
    private static final String LEFT_BORDER = "┃ ";
    private static final String BOTTOM_BORDER = "┹┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄";
    private static final int MAX_LEN = 5000; //单条log打印长度限制为 4*1024个字符长度 网上多把这个值设置为4000，经测试发现还是会丢失内容

    /**
     * 打印完整日志
     */
    public static void d(String tag, String msg) {
        if (ISRELEASE) {
            return;
        }

        //打印上边框
        if (isLogBorder) {
            printBorder(DEBUG, tag, true);
        }

        //防止 日志长度超限 导致日志信息打印不全
//        int len = msg.length();
//        int countOfSub = len / MAX_LEN;
//        int index = 0;
//        if (countOfSub > 0) {
//            String sub;
//            for (int i = 0; i < countOfSub; i++) {
//                sub = msg.substring(index, index + MAX_LEN);
//                printSubLog(DEBUG, tag, sub);
//                index += MAX_LEN;
//            }
//            printSubLog(DEBUG, tag, msg.substring(index, len));
//        } else {
            printSubLog(DEBUG, tag, msg);
//        }
        //打印下边框
        if (isLogBorder) {
            printBorder(DEBUG, tag, false);
        }
    }

    /**
     * 打印日志内容
     *
     * @param type
     * @param tag
     * @param msg
     */
    public static void printSubLog(final int type, final String tag, String msg) {
        if (ISRELEASE) {
            return;
        }

        if (isLogBorder) {
            msg = LEFT_BORDER + msg;
        }
        switch (type) {
            case VERBOSE:
                Log.v(tag, msg);
                break;
            case DEBUG:
                Log.d(tag, msg);
                break;
            case INFO:
                Log.i(tag, msg);
                break;
            case WARN:
                Log.w(tag, msg);
                break;
            case ERROR:
                Log.e(tag, msg);
                break;
            case ASSERT:
                Log.wtf(tag, msg);
                break;
            default:
        }
    }


    /**
     * 打印日志边框
     *
     * @param type
     * @param tag
     * @param isTop
     */
    private static void printBorder(int type, String tag, boolean isTop) {
        String border = isTop ? TOP_BORDER : BOTTOM_BORDER;
        switch (type) {
            case VERBOSE:
                Log.v(tag, border);
                break;
            case DEBUG:
                Log.d(tag, border);
                break;
            case INFO:
                Log.i(tag, border);
                break;
            case WARN:
                Log.w(tag, border);
                break;
            case ERROR:
                Log.e(tag, border);
                break;
            case ASSERT:
                Log.wtf(tag, border);
                break;
            default:
        }
    }


    public static void w(String tag, String msg) {
        if (ISRELEASE) {
            return;
        }
        if (WARN <= CURRENT_LEVEL) {
            Log.w(tag, msg);
        }
    }

    public static void e(String tag, String msg) {
        if (ISRELEASE) {
            return;
        }
        if (ERROR <= CURRENT_LEVEL) {
            Log.e(tag, msg);

        }
    }

}
